;; https://projecteuler.net/problem=29

;; Consider all integer combinations of a^b for

;; 2 ≤ a ≤ 5 and 2 ≤ b ≤ 5

;; :

;;     2^2=4, 2^3=8, 2^4=16, 2^5=32
;;     3^2=9, 3^3=27, 3^4=81, 3^5=243
;;     4^2=16, 4^3=64, 4^4=256, 4^5=1024
;;     5^2=25, 5^3=125, 5^4=625, 5^5=3125

;; If they are then placed in numerical order, with any repeats
;; removed, we get the following sequence of 15 distinct terms:

;; 4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024,
;; 3125

;; How many distinct terms are in the sequence generated by ab
;; for

;; 2 ≤ a ≤ 100 and 2 ≤ b ≤ 100

;; ?

(import
 (except (rnrs base) let-values map)
 (only (guile)
       lambda* λ)
 (srfi srfi-69)  ; hash tables
 ;; (srfi srfi-1)  ; reduce
 (contract)
 (prefix (lib math) math:)
 (lib print-utils))


(let ([a-limit 100] [b-limit 100]
      [a-start 2] [b-start 2]
      [calc-value (λ (a b) (expt a b))])
  (define numbers-table
    (let iter ([a a-start]
               [b b-start]
               [numbers (make-hash-table =)])
      (cond
       [(> a a-limit)
        ;; (print "increase b to" (+ b 1))
        (iter a-start (+ b 1) numbers)]
       [(> b b-limit)
        numbers]
       [else
        (hash-table-set! numbers (calc-value a b) #t)
        (iter (+ a 1) b numbers)])))
  ;; (print "numbers:" numbers-table)
  (print "distinct values:"
         (length
          (hash-table-keys numbers-table))))
